package com.agile.ecloud.sdk.util;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;

/**
 * 加密解密工具类
 */
public class AESUtil {

    private static final String KEY_PWD = "xxxx";

    private static final String DEFAULT_CODE = "utf-8";

    /**
     * 加密
     * 
     * @param content
     *            需要加密的内容
     * @param password
     *            加密密码
     * @return
     */
    public static byte[] encrypt(String content, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(password.getBytes(DEFAULT_CODE));
            kgen.init(128, secureRandom);
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(byteContent);
            return result; // 加密
        } catch (Exception e) {
            // 暂时什么也不做
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 使用默认的密钥加密
     * 
     * @param content
     * @return
     */
    public static String encrypt(String content) {
        byte[] result = encrypt(content, KEY_PWD);
        if (result == null) {
            return null;
        } else {
            return parseByte2HexStr(result);
        }
    }

    /**
     * 使用默认的密钥加密
     *
     * @param content 加密内容
     * @return
     */
    public static String encryptKey(String content, String key) {
        byte[] result = encrypt(content, key);
        if (result == null) {
            return null;
        } else {
            return parseByte2HexStr(result);
        }
    }

    /**
     * 解密
     * 
     * @param content
     *            待解密内容
     * @param password
     *            解密密钥
     * @return
     */
    public static String decrypt(byte[] content, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(password.getBytes(DEFAULT_CODE));
            kgen.init(128, secureRandom);
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(content);
            return new String(result); // 加密
        } catch (Exception e) {
            // 暂时什么也不做
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 使用默认的key解密
     * 
     * @param content
     * @return
     */
    public static String decrypt(String content) {
        return decrypt(parseHexStr2Byte(content), KEY_PWD);
    }


    /**
     *
     *
     * @param content 解密内容
     * @param key  解密key
     * @return 内容
     */
    public static String decryptKey(String content, String key) {
        return decrypt(parseHexStr2Byte(content), key);
    }



    /**
     * 将二进制转换成16进制
     * 
     * @param buf
     * @return
     */
    public static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    /**
     * 将16进制转换为二进制
     * 
     * @param hexStr
     * @return
     */
    public static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1)
            return null;
        byte[] result = new byte[hexStr.length() / 2];
        try {
            for (int i = 0; i < hexStr.length() / 2; i++) {
                int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
                int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
                result[i] = (byte) (high * 16 + low);
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
            return null;
        }
        return result;
    }

    public static void main(String[] args) {
        // 加密
        // System.out.println(encrypt("jdbc:mysql://127.0.0.01:3306/sdns"));
        // System.out.println(encrypt("root"));
        // System.out.println(encrypt("191abc!@#"));
        // //解密
        // System.out.println(decrypt("BDC71664FC3CAD4963F760C81EB988CA42820975A7A47D995C411864927C6AB14E7890A89C642B8FE158F00D34519132"));
        // System.out.println(decrypt("C4485E09D6A3F71182C6615828141249"));
        System.out.println(decrypt("6067350582F9AFF97D8487FEE9B4F26E"));
        // System.out.println(java.util.UUID.randomUUID().toString());
        // System.out.println("---------------");
        // System.out.println(encrypt("123!@#$"));

    }
}
